//
//  Vector2D.hpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/22.
//

//------------------------------------------------------------------------------
//【文件名】Vector2D.hpp
//【功能模块和目的】二维向量类模版定义及实现，用于存储T类型元素的二维度向量
//【开发者及日期】范静涛 2024/7/22
//【更改记录】
//------------------------------------------------------------------------------

#ifndef Vector2D_hpp
#define Vector2D_hpp

//size_t所属头文件
#include <cstddef>
//Vector基类模版所属头文件
#include "Vector.hpp"
//Vector3D类模版所属头文件
#include "Vector3D.hpp"

//------------------------------------------------------------------------------
//【类模版名】Vector2D
//【功能】二维向量向量模版
//【接口说明】
//    继承了基类全部接口
//    默认构造函数
//    带参数构造函数
//    拷贝构造函数
//    赋值运算符overload
//    虚析构函数（可能做基类）
//    叉积运算符overload，因二维向量叉乘结果是三维向量(从概念出发，因存在的对象行为，进行了修改)
//    叉积函数overwrite，因二维向量叉乘结果是三维向量(从概念出发，因存在的对象行为，进行了修改)
//【开发者及日期】 范静涛 2024/7/22
//【更改记录】
//------------------------------------------------------------------------------
template <class T>
class Vector2D : public Vector<T, 2>{
public:
    //--------------------------------------------------------------------------
    //必要的构造、析构、赋值行为
    //--------------------------------------------------------------------------
    //继承基类构造函数（不包括拷贝构造）
    using Vector<T, 2>::Vector;
    //拷贝构造函数
    Vector2D(const Vector2D& Source);
    //带参构造函数，用于基类对象向派生类对象转换
    Vector2D(const Vector<T, 2>& Source);
    //赋值运算符overload
    Vector2D& operator=(const Vector2D& Source);
    //赋值运算符overload，用于基类对象向派生类对象赋值
    Vector2D& operator=(const Vector<T, 2>& Source);
    //--------------------------------------------------------------------------
    //非静态Getter成员函数：需检查所有Getter是否有后置const
    //--------------------------------------------------------------------------
    //叉积运算符overload, 因二维向量叉乘结果是三维向量（返回值不同，不是overload判断标准）
    Vector3D<T> operator*(const Vector2D& AVector) const;
    //叉积函数overwrite, 因二维向量叉乘结果是三维向量
    Vector3D<T> CrossProduct(const Vector<T, 2>& AVector) const;
 };

//------------------------------------------------------------------------------
//必要的构造、析构、赋值行为
//------------------------------------------------------------------------------

//函数名：Vector2D
//功能：拷贝构造函数，手动触发基类拷贝构造初始化基类部分
//入口参数：const Vector2D& Source
//出口参数：无
//返回值：无
template <class T>
Vector2D<T>::Vector2D(const Vector2D& Source) : Vector<T, 2>(Source){
}
//------------------------------------------------------------------------------

//函数名：Vector2D
//功能：带参构造函数，用于基类对象向派生类对象转换，手动触发基类拷贝构造初始化基类部分
//入口参数：const Vector<T, 2>& Source
//出口参数：无
//返回值：无
template <class T>
Vector2D<T>::Vector2D(const Vector<T, 2>& Source) : Vector<T, 2>(Source){
}
//------------------------------------------------------------------------------

//函数名：operator=
//功能：赋值运算符overload
//入口参数：const Vector2D& Source
//出口参数：无
//返回值：二维向量自身的引用
template <class T>
Vector2D<T>& Vector2D<T>::operator=(const Vector2D& Source){
    if (this != &Source) {
        Vector<T, 2>::operator=(Source);
    }
    return *this;
}
//------------------------------------------------------------------------------

//函数名：operator=
//功能：赋值运算符overload，用于基类对象向派生类对象赋值，手动触发基类拷赋值运算符，赋值基类部分
//入口参数：const Vector<T, 2>& Source
//出口参数：无
//返回值：二维向量自身的引用
template <class T>
Vector2D<T>& Vector2D<T>::operator=(const Vector<T, 2>& Source){
    if (this != &Source) {
        Vector<T, 2>::operator=(Source);
    }
    return *this;
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//非静态Getter成员函数：需检查所有Getter是否有后置const
//------------------------------------------------------------------------------

//函数名：operator* const
//功能：叉积运算符overload, 因二维向量叉乘结果是三维向量
//入口参数：const Vector2D& AVector
//出口参数：无
//返回值：Vector3D对象
template <class T>
Vector3D<T> Vector2D<T>::operator*(const Vector2D& AVector) const{
    return CrossProduct(AVector);
}
//------------------------------------------------------------------------------

//函数名：CrossProduct const
//功能：叉积函数overwrite, 因二维向量叉乘结果是三维向量
//入口参数：const Vector<T, 2>& AVector
//出口参数：无
//返回值：Vector3D对象template <class T>
Vector3D<T> Vector2D<T>::CrossProduct(const Vector<T, 2>& AVector) const{
    Vector3D<T> Res;
    Res.Components[2] = Vector<T, 2>::Components[0] * AVector.Components[1] 
                      - Vector<T, 2>::Components[1] * AVector.Components[0];
    return Res;
}
//------------------------------------------------------------------------------

#endif /* Vector2D_hpp */
